<?php
/**
 * User: LRZ
 * Date: 2020/3/2
 * Time: 11:44
 */

/**
 *  345.反转字符串中的元音字母
 *
 *  标签：双指针、字符串
 *
 *  编写一个函数，以字符串作为输入，反转该字符串中的元音字母。
 *
 *  示例 1:
 *      输入: "hello"
 *      输出: "holle"
 *
 *  示例 2:
 *      输入: "leetcode"
 *      输出: "leotcede"
 *
 *  说明: 元音字母不包含字母"y"。
 *
 *  来源：力扣（LeetCode）
 *  链接：https://leetcode-cn.com/problems/reverse-vowels-of-a-string
 *  著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

$start = microtime(true);

$s   = 'leetcoda';
$res = reverseVowels($s);

$end = microtime(true);
print_r($res);
printf(' total run: %.2f s<br>' . 'memory usage: %.2f M<br> ', $end - $start, memory_get_usage() / 1024 / 1024);

function reverseVowels($s)
{
    $i      = 0;
    $j      = strlen($s) - 1;
    $vowels = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'];

    while ($i < $j) {
        # 当字母不是元音时，指针右移
        while ($i < $j && !in_array($s[$i], $vowels, true)) {
            $i++;
        }
        # 当字母不是元音时，指针左移
        while ($i < $j && !in_array($s[$j], $vowels, true)) {
            $j--;
        }
        # 交换元素
        $tmp   = $s[$i];
        $s[$i] = $s[$j];
        $s[$j] = $tmp;
        $i++;
        $j--;
    }
    return $s;
}